/*****************************************************************************
 *  @file     数据处理头文件
 *  @author   Liukh01
 *  @brief    实现有关电影终端的数据处理
 *****************************************************************************/

#ifndef DATE_HANDEL_H
#define DATE_HANDEL_H

//-------------------------------------------------------------------
// 标准头文件
//-------------------------------------------------------------------

#include <stdio.h>
#include <time.h>

//-------------------------------------------------------------------
// 自定义头文件
//-------------------------------------------------------------------
#include "src/main.h"

//-------------------------------------------------------------------
// 宏定义
//-------------------------------------------------------------------

#define FILM_DATE_PATH "./res/film_date.txt"
#define ACCOUNT_DATE_PATH "./res/account_date.txt"
#define ORDER_DATE_PATH "./res/order_date.txt"
#define SESSION_DATE_PATH "./res/session_date.txt"
#define HALL_DATE_PATH "./res/hall_date.txt"

//-------------------------------------------------------------------
// 枚举体
//-------------------------------------------------------------------

typedef enum account_type
{
    TOURIST = 0,            /**< 游客 */
    REGULAR_MEMBERS = 1,    /**< 普通会员 */
    HIGH_LEVEL_MEMBERS = 2, /**< 高级会员 */
    SUPER_MEMBERS = 3,      /**< 超级会员 */
} ACC_TYPE;

//-------------------------------------------------------------------
// 结构体定义
//-------------------------------------------------------------------

/**
 * @brief 电影信息
 */
typedef struct film_information
{
    long film_id;             /*!< 电影ID */
    char *film_name;          /*!< 电影名称 */
    float film_score;         /*!< 电影评分 */
    char *film_label;         /**< 电影标签 */
    time_t film_release_time; /**< 上映时间 */
    time_t film_play_time;    /**< 电影时长 */
    char *film_small_photo;   /*!< 电影小图地址 */
    char *film_big_photo;     /*!< 电影大图地址 */
    // lv_obj_t *film_btn;       /**< 电影按钮 */
} film_info;

/**
 * @brief 账号信息
 */
typedef struct account_information
{
    long acc_id;        /*!< 账号ID */
    ACC_TYPE acc_type;  /*!< 账号类型 */
    char *acc_phone;    /**< 电话号码 */
    char *acc_id_card;  /**< 身份证号 */
    time_t acc_time;    /**< 注册时间 */
    long member_id;     /**< 会员ID */
    double acc_balance; /**< 账号余额 */
} acc_info;

/**
 * @brief 订单信息
 */
typedef struct order_information
{
    long order_id;      /*!< 订单ID */
    long acc_id;        /**< 账号ID */
    long session_id;    /**< 场次ID */
    time_t order_time;  /**< 订单时间 */
    double order_price; /**< 实际付款 */
} order_info;

/**
 * @brief 场次信息
 */
typedef struct session_information
{
    long session_id;      /*!< 场次ID */
    long film_id;         /**< 电影ID */
    long hall_id;         /**< 影厅ID */
    double session_price; /**< 观影单价 */
    time_t session_time;  /**< 场次时间 */
} session_info;

/**
 * @brief 放映厅信息
 */
typedef struct hall_information
{
    long hall_id;    /*!< 影厅ID */
    char *hall_name; /**< 影厅名称 */
} hall_info;

//-------------------------------------------------------------------
// 链表结构体
//-------------------------------------------------------------------

/**
 * @brief 电影数据双向循环链表节点
 */
typedef struct film_info_doubly_circular_linked_list
{
    film_info *film_info;  /**< 电影数据 */
    struct list_head list; /**< 内核链表 */
} film_dcll;

/**
 * @brief 账号数据双向循环链表节点
 */
typedef struct acc_info_doubly_circular_linked_list
{
    acc_info *acc_info;    /**< 账号数据 */
    struct list_head list; /**< 内核链表 */
} acc_dcll;

/**
 * @brief 订单数据双向循环链表节点
 */
typedef struct order_info_doubly_circular_linked_list
{
    order_info *order_info; /**< 订单数据 */
    struct list_head list;  /**< 内核链表 */
} order_dcll;

/**
 * @brief 场次数据双向循环链表节点
 */
typedef struct session_info_doubly_circular_linked_list
{
    session_info *session_info; /**< 场次数据 */
    struct list_head list;      /**< 内核链表 */
} session_dcll;

/**
 * @brief 放映厅数据双向循环链表节点
 */
typedef struct hall_info_doubly_circular_linked_list
{
    hall_info *hall_info;  /**< 放映厅数据 */
    struct list_head list; /**< 内核链表 */
} hall_dcll;

//-------------------------------------------------------------------
// 双向循环链表头节点
//-------------------------------------------------------------------

// 电影头节点
extern struct list_head *film_dcll_head;
// 账号头节点
extern struct list_head *acc_dcll_head;
// 订单头节点
extern struct list_head *order_dcll_head;
// 场次头节点
extern struct list_head *session_dcll_head;
// 放映厅头节点
extern struct list_head *hall_dcll_head;

//-------------------------------------------------------------------
// 链表操作
//-------------------------------------------------------------------

/**
 * @brief  初始化所有链表头节点
 * @return void 无
 * @return void 无
 */
void init_all_dcll(void);

//-------------------------------------------------------------------
// 加载节点
//-------------------------------------------------------------------
/**
 * @brief  读取电影节点并尾插
 * @param  参数类型  参数简述
 * @return int  失败（-1）成功（0）
 */
int load_film_node(void);
/**
 * @brief  读取账号节点并尾插
 * @param  参数类型  参数简述
 * @return int  失败（-1）成功（0）
 */
int load_acc_node(void);
/**
 * @brief  读取场次节点并尾插
 * @param  参数类型  参数简述
 * @return int  失败（-1）成功（0）
 */
int load_session_node(void);
/**
 * @brief  读取订单节点并尾插
 * @param  参数类型  参数简述
 * @return int  失败（-1）成功（0）
 */
int load_order_node(void);
/**
 * @brief  读取放映厅节点并尾插
 * @param  参数类型  参数简述
 * @return int  失败（-1）成功（0）
 */
int load_hall_node(void);

//-------------------------------------------------------------------
// 保存节点信息
//-------------------------------------------------------------------

/**
 * @brief  保存账户节点信息
 * @param  参数类型  参数简述
 * @return int  失败（-1）成功（0）
 */
int save_acc_node(void);

/**
 * @brief  保存订单节点信息
 * @param  参数类型  参数简述
 * @return int  失败（-1）成功（0）
 */
int save_order_node(void);

//-------------------------------------------------------------------
// 追加节点信息
//-------------------------------------------------------------------

/**
 * @brief  添加注册的会员
 * @param  char * 电话号码
 * @param  char * 身份证号
 * @param  ACC_TYPE 账号类型
 * @return int  失败（-1）成功（0）
 */
int add_acc_node(char *phone, char *id_card, ACC_TYPE type);

/**
 * @brief  添加订单信息
 * @param  long  账号ID
 * @param  long  场次ID
 * @param  double  实际付款
 * @return int  失败（-1）成功（0）
 */
int add_order_node(long acc_id, long session_id, double price);

//-------------------------------------------------------------------
// 系统数据操作
//-------------------------------------------------------------------

/**
 * @brief  加载系统数据
 * @param  void
 * @return void
 */
void load_system_date(void);

#endif